require "test_helper"

class Card::ReadableTest < ActiveSupport::TestCase
  test "read clears events notifications" do
    assert_changes -> { notifications(:logo_published_kevin).reload.read? }, from: false, to: true do
      assert_changes -> { notifications(:logo_assignment_kevin).reload.read? }, from: false, to: true do
        cards(:logo).read_by(users(:kevin))
      end
    end
  end

  test "read clear mentions in the description" do
    assert_changes -> { notifications(:logo_card_david_mention_by_jz).reload.read? }, from: false, to: true do
      cards(:logo).read_by(users(:david))
    end
  end

  test "read clear mentions in comments" do
    assert_changes -> { notifications(:logo_comment_david_mention_by_jz).reload.read? }, from: false, to: true do
      cards(:logo).read_by(users(:david))
    end
  end

  test "read clears notifications from the comments" do
    assert_changes -> { notifications(:layout_commented_kevin).reload.read? }, from: false, to: true do
      cards(:layout).read_by(users(:kevin))
    end
  end

  test "unread marks events notifications as unread" do
    notifications(:logo_published_kevin).read
    notifications(:logo_assignment_kevin).read

    assert_changes -> { notifications(:logo_published_kevin).reload.read? }, from: true, to: false do
      assert_changes -> { notifications(:logo_assignment_kevin).reload.read? }, from: true, to: false do
        cards(:logo).unread_by(users(:kevin))
      end
    end
  end

  test "unread marks mentions in the description as unread" do
    notifications(:logo_card_david_mention_by_jz).read

    assert_changes -> { notifications(:logo_card_david_mention_by_jz).reload.read? }, from: true, to: false do
      cards(:logo).unread_by(users(:david))
    end
  end

  test "unread marks mentions in comments as unread" do
    notifications(:logo_comment_david_mention_by_jz).read

    assert_changes -> { notifications(:logo_comment_david_mention_by_jz).reload.read? }, from: true, to: false do
      cards(:logo).unread_by(users(:david))
    end
  end

  test "unread marks notifications from the comments as unread" do
    notifications(:layout_commented_kevin).read

    assert_changes -> { notifications(:layout_commented_kevin).reload.read? }, from: true, to: false do
      cards(:layout).unread_by(users(:kevin))
    end
  end

  test "remove inaccessible notifications" do
    card = cards(:logo)
    kevin = users(:kevin)
    david = users(:david)

    assert card.accessible_to?(kevin)
    kevin_notifications = [ notifications(:logo_published_kevin), notifications(:logo_assignment_kevin) ]
    david_notifications = [ notifications(:logo_card_david_mention_by_jz), notifications(:logo_comment_david_mention_by_jz) ]

    # Kevin loses access
    card.board.accesses.find_by(user: kevin).destroy
    assert_not card.accessible_to?(kevin)
    assert card.accessible_to?(david)

    card.remove_inaccessible_notifications

    # Kevin's notifications removed
    kevin_notifications.each do |notification|
      assert_not Notification.exists?(notification.id)
    end

    # David's notifications preserved
    david_notifications.each do |notification|
      assert Notification.exists?(notification.id)
    end
  end
end
